package d4_homework;

import java.io.*;

public class FirstQuestion {
    public static void main(String[] args) {
        //目标: 能够使用递归调用定义方法,复制文件夹
        //1、创建两个路径
        //源文件路径: D:\javadevelop\2024班\02阶段java基础进阶\陈某总结
        //目标路径: D:\javadevelop\2024班\02阶段java基础进阶\陈某总结\新建文件夹
        //进行方法调用看一下
        try {
            copyDirectory(new File("D:\\javadevelop\\2024班\\02阶段java基础进阶\\陈某总结"),
                    new File("D:\\javadevelop\\2024班\\02阶段java基础进阶\\小花朵\\uug"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //1、复制文件的功能-->独立功能独立成方法
    //形参列表--> 要复制的路径,和复制之后的路径
    //返回值类型---> 不需要
    public static void copyFileDirectory(File file, File newDir) throws Exception {
        //1、输入输出流会做判断, 先不做极端判断
        //创建字节输入流与源文件接通
        InputStream fis = new FileInputStream(file);

        //2、创建字节输出流与输出位置的管道
        //复制文件要创建目标文件,如果没有设定目标文件就会报错
        File destFile = new File(newDir, file.getName());
        OutputStream fos = new FileOutputStream(destFile);

        //3、准备一个字节数组
        byte[] buffer = new byte[1024 * 10];//相当于一个缓冲池

        //4、开始进行复制
        int len;//用于记录读取到的字节个数
        //循环读取
        while ((len = fis.read(buffer)) != -1) {
            //进行读多少倒多少
            fos.write(buffer, 0, len);
        }
        //进行关闭流操作
        fis.close();
        fos.close();

    }

    //2、定义一个复制文件夹的方法
    public static void copyDirectory(File srcDir, File destDir) throws Exception {

        //首先做极端判断
        if (srcDir == null || destDir == null || !srcDir.exists() || !destDir.exists()
                || srcDir.isFile() || destDir.isFile()) {
            System.out.println("1111111");
            //上述情况都不做复制
            return;
        }

        //2.1在目标文件夹创建源文件夹
        File newDir = new File(destDir, srcDir.getName());
        //进行判断新建文件是否存在,不存在创建
        if (!newDir.exists()) {
            newDir.mkdirs();
        }

        //2.2获取源文件下的所哟一级文件对象
        File[] files = srcDir.listFiles();
        //进行极端判断
        if (files == null || files.length == 0) {
            //没有权限获取下面的文件或文件夹-->或者是一个空文件夹
            //直接结束复制
            return;
        }

        //2.3 到这里就可开始复制了
        //遍历所有的一级文件对象
        for (File file : files) {
            //判断是否是文件
            if (file.isFile()){
                //证明是文件,进行复制
                copyFileDirectory(file, newDir);
            }
            if (file.isDirectory()){
                //是文件就进行递归
                copyDirectory(file, newDir);
            }
        }

    }

}
